<?php

// Cria o path do plugin
if(!defined("MAIL_PLUGIN_PATH")) {
	define("MAIL_PLUGIN_PATH", APPLICATION_PATH . "plugins/mail/");
}

// Inclui os formularios
require_once(MAIL_PLUGIN_PATH . "frmAddAccounts.form.php");

/**
 * 
 */
class mailPlugin {
	/**
	 * Armazena o objeto principal
	 * 
	 * @access protected
	 * @name $mainObject
	 * @var Resource
	 */
	protected $mainObject = NULL;
	
	/**
	 * Armazena os widgets necessarios
	 * 
	 * @access private
	 * @name $widgets
	 * @var array
	 */
	public $widgets = array();
	
	/**
	 * Armazena as configurações
	 * 
	 * @access protected
	 * @name $config
	 * @var array
	 */
	public $config = array();
	
	/**
	 * Armazena os emails
	 * 
	 * @access protected
	 * @name $_mails
	 * @var array
	 */
	public $_mails = array();
	
	/**
	 * Construtor
	 * 
	 * @name __construct
	 */
	public function __construct($main) {
		// Armazena o objeto principal
		$this->mainObject = $main;
		
		// Carrega as configurações
		$this->config = $this->__loadJSONConfig();
		
		// Inicia os menus das contas
		$this->widgets['mnuAccounts'] = array();
		
		// Carrega os emails nos menus
		$this->loadMails();
		
		// Cria um separador
		$this->mainObject->addToMenu(new GtkSeparatorMenuItem());
		
		// Cria o item do menu
		$this->widgets['mnuItem'] = Fabula::GtkMenuItem("Configurações de email");
		
		// Cria o menu
		$this->widgets['mnuMail'] = Fabula::GtkMenu();
		$this->widgets['mnuItem']->set_submenu($this->widgets['mnuMail']);
		
		// Cria o item de configuração
		$this->widgets['mnuMail']->append_item("Configurações de contas", array($this, "mnuAccounts_onclick"));
		
		// Adiciona o item ao menu principal
		$this->mainObject->addToMenu($this->widgets['mnuItem']);
	}
	
	/**
	 * Método que carrega os emails no menu principal
	 * 
	 * @access public
	 * @name loadMails
	 */
	public function loadMails() {
		// Inicia os menus das contas
		$this->_mails = array();
		
		// Percorre as contas
		foreach($this->config['accounts'] as $account) {
			// Verifica se é um vetor de uma conta
			if(is_array($account)) {
				// Connecta a conta ao imap
				$imap = imap_open("{" . $account['server'] . ":" . $account['port'] . "/imap/ssl}INBOX", $account['user'], $account['password']);
				
				
				// Cria o menu
				$item = Fabula::GtkMenuItem($account['description']);
				
				// Adiciona o item ao menu principal
				$this->mainObject->addToMenu($item);
				
				// Adiciona ao vetor
				$this->_mails[$account['idaccount']] = array(
					'idaccount' => $account['idaccount'],
					'description' => $account['description'],
					'imap' => $imap,
					'menu' => $item
				);
				
				// Adiciona o timer
				Gtk::timeout_add(100, array($this, "verifyNews"), $account['idaccount']);
			}
		}
	}
	
	/**
	 * Verifica novos emails
	 * 
	 * @name verifyNews
	 */
	public function verifyNews($idaccount) {
		// Recupera o objeto
		$mail = $this->_mails[$idaccount];
		
		// Mostra o status
		echo "Verificando " . $mail['description'] . "\n";
		
		// Le as informações da caixa
		$check = imap_status($mail['imap'], "{imap.gmail.com}INBOX", SA_UNSEEN);
		
		// Atualiza o item do menu
		$str = "";
		if($check->unseen > 0) {
			$str = " (" . $check->unseen . ")";
		}
		$mail['menu']->set_label($mail['description'] . $str);
		
		// Inicia outro timer
		Gtk::timeout_add(5000, array($this, "verifyNews"), $idaccount);
		
		// Cancela o timer
		return FALSE;
	}
	
	/**
	 * Método que carrega as informações do json
	 * 
	 * @access private
	 * @name __loadJSONConfig
	 */
	private function __loadJSONConfig() {
		// Cria o arquivo
		$filename = MAIL_PLUGIN_PATH . "config.json";
		
		// Carrega o arquivo
		$contents = file_get_contents($filename);
		
		// Desencoda o json
		$config = json_decode($contents);
		
		// Retorna o vetor
		return objectToArray($config);
	}
	
	/**
	 * Método do menu contas
	 * 
	 * @name mnuAccounts_onclick
	 */
	public function mnuAccounts_onclick() {
		// Cria a janela de configuração
		$form = new frmAddAccounts($this);
		
		// Mostra a janela
		$form->widgets['frmAddAccounts']->show_all();
	}
	
	/**
	 * Método que retorna o item para adicionar
	 * 
	 * @name getMenuItem
	 * @return GtkMenuItem
	 */
	public function getMenuItem() {
		return $this->widgets['mnuItem'];
	}
}
